package com.tabnet.form;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import com.tabnet.beans.personnes.Adresse;
import com.tabnet.beans.personnes.Fournisseur;
import com.tabnet.dao.DAOException;
import com.tabnet.dao.DAOFournisseur;

public class CreationFournisseurForm 
{
	private static final String CHAMP_IDF      = "idF";
    private static final String CHAMP_RAISON   = "raison";
    private static final String CHAMP_RUE      = "rue";
    private static final String CHAMP_CP       = "cp";
    private static final String CHAMP_VILLE    = "ville";
    private static final String CHAMP_Pays     = "pays";
    private static final String CHAMP_MAIL     = "mail";
    private static final String CHAMP_MDP      = "mdp";

    private String              resultat;
    private HashMap<String, String> erreurs        = new HashMap<String, String>();
    private DAOFournisseur      fournDao;


    public CreationFournisseurForm( DAOFournisseur fournDao ) {
        this.fournDao = fournDao;
    }

    public HashMap<String, String> getErreurs() {
        return erreurs;
    }

    public String getResultat() {
        return resultat;
    }

    /**
     * Méthode qui créer un fournisseur à partir des données entrées par le gestionnaire.
     * Si aucune erreur, le fournisseur est enregistré dans la base de données
     * sinon le gestionnaire doit corriger les erreurs.
     * @param request
     * @return Fournisseur
     */
    public Fournisseur creerFournisseur( HttpServletRequest request ) {
    	
    	// récupération des valeurs
        String id = getValeurChamp( request, CHAMP_IDF );
        String raisonSociale = getValeurChamp( request, CHAMP_RAISON );
        
        String rue = getValeurChamp( request, CHAMP_RUE );
        String ville = getValeurChamp( request, CHAMP_VILLE );
        String cp = getValeurChamp( request, CHAMP_CP );
        String pays = getValeurChamp( request, CHAMP_Pays );
        
        String mail = getValeurChamp( request, CHAMP_MAIL );
        String mdp = getValeurChamp( request, CHAMP_MDP );

        // création des objets
        Fournisseur fourn = new Fournisseur();
        Adresse adresse = new Adresse();

        // les tests de validation des données
        traiterId(id,fourn);
        traiterRaison(raisonSociale,fourn);
        traiterRue(rue,adresse);
        traiterVille(ville,adresse);
        traiterCp(cp,adresse);
        traiterPays(pays,adresse);
        traiterMail(mail,fourn);
        traiterMdp(mdp,fourn);
        
        fourn.set_AdresseF(adresse);

        try {
            if ( erreurs.isEmpty() ) {
            	fournDao.addFournisseur( fourn );
                resultat = "Succès de la création du fournisseur.";
            } else {
                resultat = "Échec de la création du fournisseur.";
            }
        } catch ( DAOException e ) {
            setErreur( "imprévu", "Erreur imprévue lors de la création." );
            resultat = "Échec de la création du fournisseur : une erreur imprévue est survenue, merci de réessayer dans quelques instants.";
            e.printStackTrace();
        }

        return fourn;
    }
    
    // les traitements
    private void traiterId( String id, Fournisseur fourn ) {
        try {
            validationId( id );
        } catch ( Exception e ) {
            setErreur( CHAMP_IDF, e.getMessage() );
        }
        fourn.set_IdF( id );
    }
    
    private void traiterRaison( String raisonSociale, Fournisseur fourn ) {
        try {
            validationRaison(raisonSociale);
        } catch ( Exception e ) {
            setErreur( CHAMP_RAISON, e.getMessage() );
        }
        fourn.set_RaisonSociale( raisonSociale );
    }
    
    private void traiterRue( String rue, Adresse adresse ) {
        try {
        	validationRue( rue );
        } catch ( Exception e ) {
            setErreur( CHAMP_RUE, e.getMessage() );
        }
        adresse.setRue( rue );
    }
    
    private void traiterCp( String cp, Adresse adresse ) {
        try {
        	validationCp( cp );
        } catch ( Exception e ) {
            setErreur( CHAMP_CP, e.getMessage() );
        }
        adresse.setCodePostal( cp );
    }
    
    private void traiterVille( String ville, Adresse adresse ) {
        try {
        	validationVille( ville );
        } catch ( Exception e ) {
            setErreur( CHAMP_VILLE, e.getMessage() );
        }
        adresse.setVille( ville );
    }
    
    private void traiterPays( String pays, Adresse adresse ) {
        try {
        	validationPays( pays );
        } catch ( Exception e ) {
            setErreur( CHAMP_Pays, e.getMessage() );
        }
        adresse.setPays(pays);
    }
    
    private void traiterMail( String mail, Fournisseur fourn ) {
        try {
            validationMail( mail, fourn.get_IdF());
        } catch ( Exception e ) {
            setErreur( CHAMP_MAIL, e.getMessage() );
        }
        fourn.set_Mail( mail );
    }
    
    private void traiterMdp( String mdp, Fournisseur fourn ) {
        try {
            validationMdp( mdp );
        } catch ( Exception e ) {
            setErreur( CHAMP_MDP, e.getMessage() );
        }
        fourn.set_Mdp( mdp );
    }
    
    // les validations
    private void validationId( String id ) throws FormValidationException, DAOException {
        if(!fournDao.verificationID(id)){
        	throw new FormValidationException( "Le code du fournisseur est déjà existant." );
        }else if ( id != null ) {
            if ( id.length() < 2 ) {
                throw new FormValidationException( "Le code du fournisseur doit contenir au moins 2 caractères." );
            }
        } else {
            throw new FormValidationException( "Merci d'entrer un code Fournisseur." );
        }
    }

    private void validationRaison( String raisonSociale ) throws FormValidationException {
        if ( raisonSociale != null && raisonSociale.length() < 2 ) {
            throw new FormValidationException( "La raison sociale doit contenir au moins 2 caractères." );
        }
    }

    private void validationPays( String pays ) throws FormValidationException {
        if ( pays != null ) {
            if ( pays.length() < 2 ) {
                throw new FormValidationException( "Le pays du fournisseur doit contenir au moins 2 caractères." );
            }
        } else {
            throw new FormValidationException( "Merci d'entrer le pays du Fournisseur." );
        }
    }
    
    private void validationVille( String ville ) throws FormValidationException {
        if ( ville != null ) {
            if ( ville.length() < 2 ) {
                throw new FormValidationException( "La ville du fournisseur doit contenir au moins 2 caractères." );
            }
        } else {
            throw new FormValidationException( "Merci d'entrer la ville du Fournisseur." );
        }
    }
    
    private void validationRue( String rue ) throws FormValidationException {
        if ( rue != null ) {
            if ( rue.length() < 2 ) {
                throw new FormValidationException( "La rue du fournisseur doit contenir au moins 2 caractères." );
            }
        } else {
            throw new FormValidationException( "Merci d'entrer la rue du Fournisseur." );
        }
    }

    private void validationCp( String cp ) throws FormValidationException {
        if ( cp != null ) {
            if ( !cp.matches( "^\\d+$" ) ) {
                throw new FormValidationException( "Le code postal doit uniquement contenir des chiffres." );
            } else if ( cp.length() < 5 ) {
                throw new FormValidationException( "Le numéro de code postal doit contenir au moins 4 chiffres." );
            }
        } else {
            throw new FormValidationException( "Merci d'entrer un numéro de téléphone." );
        }
    }

    private void validationMail( String email, String idF ) throws FormValidationException, DAOException {
    	if(!fournDao.verificationMail(email, idF)){
    		throw new FormValidationException( "Adresse mail déjà existante." );
    	}
    	else{
	        if ( email == null || !email.matches( "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)" ) ) {
	            throw new FormValidationException( "Merci de saisir une adresse mail valide." );
	        }
    	}
    }
    
    private void validationMdp( String mdp ) throws FormValidationException {
        if ( mdp != null ) {
            if ( mdp.length() < 5 ) {
                throw new FormValidationException( "Le mot de passe du fournisseur doit contenir au moins 5 caractères." );
            }
        } else {
            throw new FormValidationException( "Merci d'entrer un mot de passe Fournisseur." );
        }
    }

    /*
     * Ajoute un message correspondant au champ spécifié à la map des erreurs.
     */
    private void setErreur( String champ, String message ) {
        erreurs.put( champ, message );
    }

    private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
        String valeur = request.getParameter( nomChamp );
        if ( valeur == null || valeur.trim().length() == 0 ) {
            return null;
        } else {
            return valeur;
        }
    }
}
